'use strict';
export class HttpService {
    static query(config) {
        console.log();
        config = config || {};
        if (config.sync == undefined)
            config.sync = true;
        var params = HttpService.formatParams(config.data);
        var request = new XMLHttpRequest();
        request.onreadystatechange = function() {
            if (request.readyState == 4) {
                var status = request.status;
                if (status >= 200 && status < 300) {
                    var res = JSON.parse(request.responseText);

                    if (res) {
                        config.success && config.success(res);
                    }
                } else {
                    return config.fail && config.fail(status);
                }
            }
        };
        request.open('GET', config.url + "?" + params, config.sync);
        request.send(null);

    }

    static save(config) {
        config = config || {};

        var params = HttpService.formatParams(config.data);

        var request = new XMLHttpRequest();
        request.onreadystatechange = function() {
            if (request.readyState == 4) {
                var status = request.status;
                if (status >= 200 && status < 300) {
                    var res = JSON.parse(request.responseText);
                    if (res) {
                        config.success && config.success(res);
                    }
                } else {
                    config.fail && config.fail(status);
                }
            }
        };
        request.open("POST", config.url, true);
        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        request.send(params);

    }

    static formatParams(data) {
        var arr = [];
        for (var name in data) {
            arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
        }
        arr.push(("v=" + Math.random()).replace(".", ""));
        return arr.join("&");
    }

}
export let msgTout = null
export class Toast {
    static toast(msg = '提示消息', duration = 3000) {
        var msgObj = document.querySelector('.tips'),
            msgSpan = msgObj
                ? msgObj.querySelector('span')
                : null;
        if (msgObj == undefined) {
            msgObj = document.createElement('div');
            msgSpan = document.createElement('span');
            msgObj.appendChild(msgSpan);
            msgObj.className = 'tips';
            document.body.appendChild(msgObj);
        }
        msgSpan.innerHTML = msg;
        msgObj.style.display = 'block';
        msgObj.style.opacity = 1;
        clearTimeout(msgTout);
        if (duration == 0)
            return;
        msgTout = setTimeout(function() {
            msgObj.style.opacity = 0;
            setTimeout(() => {
                msgObj.style.display = 'none';
            }, 600)
        }, duration);
    }
}

export class GetCurrentDate {
    static time() {
        var datetime = new Date();
        datetime.setDate(datetime.getDate());
        var year = datetime.getFullYear();
        var month = datetime.getMonth() + 1 < 10
            ? "0" + (datetime.getMonth() + 1)
            : datetime.getMonth() + 1;
        var date = datetime.getDate() < 10
            ? "0" + datetime.getDate()
            : datetime.getDate();
        var hour = datetime.getHours() < 10
            ? "0" + datetime.getHours()
            : datetime.getHours();
        var minute = datetime.getMinutes() < 10
            ? "0" + datetime.getMinutes()
            : datetime.getMinutes();
        var second = datetime.getSeconds();
        return hour + ":" + minute;
    }
}

export class Md5 {
    static MD5(s) {
        var hexcase = 0;
        var b64pad = "";
        var chrsz = 8;
        return binl2hex(core_md5(str2binl(s), s.length * chrsz));
        function b64_md5(s) {
            return binl2b64(core_md5(str2binl(s), s.length * chrsz));
        }

        function hex_hmac_md5(key, data) {
            return binl2hex(core_hmac_md5(key, data));
        }

        function b64_hmac_md5(key, data) {
            return binl2b64(core_hmac_md5(key, data));
        }

        function calcMD5(s) {
            return binl2hex(core_md5(str2binl(s), s.length * chrsz));
        }

        function md5_vm_test() {
            return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
        }

        function core_md5(x, len) {
            x[len >> 5] |= 0x80 << ((len) % 32);
            x[(((len + 64) >>> 9) << 4) + 14] = len;

            var a = 1732584193;
            var b = -271733879;
            var c = -1732584194;
            var d = 271733878;

            for (var i = 0; i < x.length; i += 16) {
                var olda = a;
                var oldb = b;
                var oldc = c;
                var oldd = d;
                a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
                d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
                c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
                b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
                a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
                d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
                c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
                b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
                a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
                d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
                c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
                b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
                a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
                d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
                c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
                b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
                a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
                d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
                c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
                b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
                a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
                d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
                c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
                b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
                a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
                d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
                c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
                b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
                a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
                d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
                c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
                b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
                a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
                d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
                c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
                b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
                a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
                d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
                c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
                b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
                a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
                d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
                c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
                b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
                a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
                d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
                c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
                b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
                a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
                d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
                c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
                b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
                a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
                d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
                c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
                b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
                a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
                d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
                c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
                b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
                a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
                d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
                c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
                b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
                a = safe_add(a, olda);
                b = safe_add(b, oldb);
                c = safe_add(c, oldc);
                d = safe_add(d, oldd);
            }
            return Array(a, b, c, d);

        }

        function md5_cmn(q, a, b, x, s, t) {
            return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
        }

        function md5_ff(a, b, c, d, x, s, t) {
            return md5_cmn((b & c) | ((~ b) & d), a, b, x, s, t);
        }

        function md5_gg(a, b, c, d, x, s, t) {
            return md5_cmn((b & d) | (c & (~ d)), a, b, x, s, t);
        }

        function md5_hh(a, b, c, d, x, s, t) {
            return md5_cmn(b ^ c ^ d, a, b, x, s, t);
        }

        function md5_ii(a, b, c, d, x, s, t) {
            return md5_cmn(c ^ (b | (~ d)), a, b, x, s, t);
        }

        function core_hmac_md5(key, data) {
            var bkey = str2binl(key);
            if (bkey.length > 16)
                bkey = core_md5(bkey, key.length * chrsz);

            var ipad = Array(16),
                opad = Array(16);
            for (var i = 0; i < 16; i++) {
                ipad[i] = bkey[i] ^ 0x36363636;
                opad[i] = bkey[i] ^ 0x5C5C5C5C;
            }

            var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
            return core_md5(opad.concat(hash), 512 + 128);
        }

        function safe_add(x, y) {
            var lsw = (x & 0xFFFF) + (y & 0xFFFF);
            var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
            return (msw << 16) | (lsw & 0xFFFF);
        }

        function bit_rol(num, cnt) {
            return (num << cnt) | (num >>> (32 - cnt));
        }

        function str2binl(str) {
            var bin = Array();
            var mask = (1 << chrsz) - 1;
            for (var i = 0; i < str.length * chrsz; i += chrsz)
                bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
            return bin;
        }

        function binl2hex(binarray) {
            var hex_tab = hexcase
                ? "0123456789ABCDEF"
                : "0123456789abcdef";
            var str = "";
            for (var i = 0; i < binarray.length * 4; i++) {
                str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
            }
            return str;
        }

        function binl2b64(binarray) {
            var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
            var str = "";
            for (var i = 0; i < binarray.length * 4; i += 3) {
                var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
                for (var j = 0; j < 4; j++) {
                    if (i * 8 + j * 6 > binarray.length * 32)
                        str += b64pad;
                    else
                        str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
                    }
                }
            return str;
        }
    }

}
export let imgUpload = (data, callback) => {
    var inputObj = document.getElementById(data.inputId);
    var imgObj = document.getElementById(data.imgId);
    if (inputObj.files && inputObj.files[0]) {
        var fr = new FileReader();
        fr.onload = function() {
            image.src = fr.result;
        };
        var file = inputObj.files[0];
        fr.readAsDataURL(inputObj.files[0]);
        var image = new Image();
        image.onload = function() {
            if (typeof data.scale != 'undefined' && data.scale != '') {
                var scaleW = data.scale.split(':')[0];
                var scaleH = data.scale.split(':')[1];
                if (image.width / scaleW != image.height / scaleH) {
                    inputObj.value = imgObj.src = '';
                    callback(false, '请按图片比例上传（' + data.scale + '）！');
                    return;
                }
            } else {
                var tips = '';
                var valid = true;
                if (typeof data.width != 'undefined' && data.width != '' && image.width != data.width) {
                    tips = '宽度：' + data.width + 'px，';
                    valid = false;
                }
                if (typeof data.height != 'undefined' && data.height != '' && image.height != data.height) {
                    tips += '高度：' + data.height + 'px，';
                    valid = false;
                }
                if (!valid) {
                    inputObj.value = imgObj.src = '';
                    callback(false, '请按图片尺寸上传(' + tips.substr(0, tips.length - 1) + ')');
                    return;
                }
            }
            if (typeof data.size != 'undefined' && data.size != '' && inputObj.files[0].size / 1024 / 1024 > data.size) {
                var sizeLimit = data.size + 'M';
                if (data.size < 1) {
                    sizeLimit = (data.size * 1024).toFixed(0) + 'KB';
                }
                inputObj.value = imgObj.src = '';
                callback(false, '请上传小于 ' + sizeLimit + ' 的图片');
                return;
            }
            var filename = file.name;
            var imgSize = image.src.length;
            var imgUrl = window.URL.createObjectURL(inputObj.files[0]);
            imgObj.src = imgUrl;

            //图片压缩
            imgCompress(imgUrl, imgSize, data.setWidth, 0.6, function(baseStr) {
                //base64转二进制流图片
                var text = window.atob(baseStr.split(",")[1]);
                var buffer = new Uint8Array(baseStr.length);
                var pecent = 0,
                    loop = null;
                for (var i = 0; i < text.length; i++) {
                    buffer[i] = text.charCodeAt(i);
                }
                var imgType = baseStr.split(';')[0].split(':')[1];
                var blob = getBlob([buffer], imgType);
                blob.filename = filename;
                callback(true, blob);
                //下载图片查看
                // var link = document.createElement('a');
                // link.href = window.URL.createObjectURL(blob);
                // link.download = filename;
                // link.click();
                // window.URL.revokeObjectURL(link.href);
            });
        };
    } else {
        //IE下，使用滤镜处理，给定宽高
        inputObj.select();
        var imgSrc = document.selection.createRange().text;
        var localImagId = document.getElementById(data.imgIeId);
        //设置初始大小
        var ieWidth = 100,ieHeight = ieWidth;
        if (typeof data.width != 'undefined' && !isNaN(data.width))
            ieWidth = data.width;
        if (typeof data.height != 'undefined' && !isNaN(data.height))
            ieHeight = data.height;
        localImagId.style.width = ieWidth + "px";
        localImagId.style.height = ieHeight + "px";
        //图片异常的捕捉，防止用户修改后缀来伪造图片
        try {
            localImagId.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
            localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;
        } catch (e) {
            callback('请选择正确的图片格式!');
            return false;
        }
        imgObj.style.display = 'none';
        document.selection.empty();
    }
}

//获取blob对象的兼容性写法
export let getBlob = (buffer, format) => {
    try {
        return new Blob(buffer, {type: format});
    } catch (e) {
        var bb = new(window.BlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder);
        buffer.forEach(function(buf) {
            bb.append(buf);
        });
        return bb.getBlob(format);
    }
}

//图片压缩
export let imgCompress = (imgUrl, initSize, setWidth = 600, quality = 0.8, callBack) => {
    var setHeight,
        canvas = document.createElement('canvas'),
        context = canvas.getContext('2d'),
        img = new Image();
    img.src = imgUrl;
    img.onload = function() {
        if (setWidth > img.width)
            setWidth = img.width
        setHeight = setWidth / img.width * img.height;
        canvas.width = setWidth;
        canvas.height = setHeight;
        context.drawImage(img, 0, 0, setWidth, setHeight);
        var basestr = canvas.toDataURL('image/jpeg', quality); //后面的小数表示图片的质量
        var newSize = basestr.length;
        console.log('oldSize：' + initSize);
        console.log('newSize：' + newSize);
        console.log('percent：' + (newSize * 100 / initSize).toFixed(2) + '%');
        callBack(basestr);
    }
}

export const imgonError = (defaultImg,e) => {
    e.target.setAttribute('src',defaultImg);
};

//时间戳转时间格式
export const getLocalTime = (number = 0) => {
    return dateFormat(new Date(number))
}
//时间字符串格式统一
export const dateStrFormat = (str) => {
    if (str == undefined)
        str = ''
    return (str + '').replace(/\-/g, '.').replace(/\//g, '.')
}

//时间保持2位，加零处理
export const allUnit = (num) => {
    if (num < 10)
        num = '0' + num
    return num;
}

//时间格式处理
export const dateFormat = (time, newSplit = '.', all = true) => {
    let nowTime = new Date();
    let year = time.getFullYear(),
        month = time.getMonth() + 1, //月
        date = time.getDate(), //日
        hours = time.getHours(), //时
        minute = time.getMinutes(), //分
        seconds = time.getSeconds(); //秒
    //当前时间
    let day = year + newSplit + allUnit(month) + newSplit + allUnit(date);
    if (newSplit == '.') {
        if (nowTime.toLocaleString().split(' ')[0].replace(/\//g, '-') == time.toLocaleString().split(' ')[0].replace(/\//g, '-')) {
            day = '今天'
        } else {
            nowTime = new Date(nowTime.setDate(nowTime.getDate() - 1))
            if (nowTime.toLocaleString().split(' ')[0].replace(/\//g, '-') == time.toLocaleString().split(' ')[0].replace(/\//g, '-')) {
                day = '昨天'
            } else if (nowTime.getFullYear() == time.getFullYear()) {
                day = allUnit(month) + newSplit + allUnit(date);
            }
        }
    }
    if (all)
        day += ' ' + allUnit(hours) + ':' + allUnit(minute);

    return day;
}
